home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / asm / Asm_Course2.lha / Teil02.TXT < prev    next >
Text File  |  1992-09-02  |  11KB  |  253 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                  2.Teil...
  4.  
  5.  
  6. So leute, nachdem wir gemoved haben machen wir noch ein paar andere
  7. spielereien in der Art.
  8. Geben wir mal ein programm ein, das folgendes macht
  9. `Einen Wert in ein register schreiben, einen anderen in ein zweites, und
  10. die beiden addieren`
  11. Wie muesste das aussehen ?
  12. Zuerst mal ein Move-befehl mit dem Ziel D0, O.K
  13.  
  14. Move.w #$4000,d0
  15.  
  16. Die direkte Adressierung fuer einen Additions befehl wuerde jetzt verlangen
  17. das wir einen direkten wert addieren.
  18. Da es aber sehr langsam ist, und viel zu unflexibel werde wir erst einen
  19. wert in ein register schreiben, und dann die beiden register miteinander
  20. Addieren.
  21.  
  22. also...
  23.  
  24. Move.w #$2000,d1
  25.  
  26. So, der Additions befehl heisst wie ihr wisst Add, und ist sehr einfach zu
  27. benutzen, naemlich so
  28.  
  29. Add.w d0,d1
  30.  
  31. Es ist mathematisch egal was ich zu was addiere, das ergebnis ist immer
  32. dasselbe, das weiss man. Allerdings macht der MC 68000 einen Unterschied,
  33. denn das Register zu dem dazu Addiert wird ist gleichzeitig auch das Ziel
  34. der Operation. Also muesste das programm so aussehen
  35.  
  36. Move.w #$4000,d0
  37. Move.w #$2000,d1
  38. Add.w  d0,d1
  39. Rts
  40.  
  41. In der Tabelle die der Seka ausgibt koennt ihr ueberpruefen ob der MC 68000
  42. auch richtig gerechnet hat, es muesste jetzt 00006000 in d1 stehen.
  43.  
  44. Naja, genug der spielerei...weitere einfache Befehle in dieser Ebene sind
  45. halt Subtrahieren (Sub), Multiplizieren (Muls) und Divdieren (Divs)
  46. Ihr koennt ja damit ein Bisschen rum Experimentieren. Aber das muesste
  47. eigentlich jedem klar sein, der Rechnen kann.
  48.  
  49. Ich werde in diesem Kurs einen Grundstamm von befehlen erklaeren der fuer
  50. Sichtbare Effekte wichtig ist, damit man nicht die Lust verliert, den
  51. soviel man auch ueber hunderttausend moeglichkeiten erfaehrt etwas zu
  52. kopieren, wenn man dabei nicht sieht, oder vorzeigen kann ist es schnell
  53. langweilig.
  54.  
  55. Also machen wir bei etwas weiter was sich schwer anhoert, aber ziemlich
  56. einfach ist.
  57.  
  58. 3.Manipulation und Bedingte verzweigung durch die Bitebene
  59.  
  60. Hoert sich ja schwierig an, ist es aber nicht. Ein Computer arbeitet den
  61. groessten Teil seiner Zeit mit bytes, words und langwords, er Kopiert,
  62. addiert rotiert diese werte und macht alles moegliche. Es gibt aber auch
  63. viele sachen die werden einfach nur angestellt oder nicht, da gibt es keine
  64. grossen auswahlmoeglichkeite wie zB. bei der farbgebung wo man halt 4096
  65. moeglichkeiten hat. Sondern da reicht es ob an oder aus, genau wie beim
  66. Lichtschalter, entweder an oder aus.
  67.  
  68. Also Bits sind ja nichts anderes als diese Schalter. Im normalen
  69. arbeitsspeicher des Amigas werden bits garnicht mehr so benutzt sondern
  70. immer nur zusammen gefasst zum Byte oder Word. Aber die ganzen
  71. zusaetzlichen Chip`s die so im Amiga arbeiten werden viel nur durch
  72. Schalter gesteuert. Entweder ist der Bildschirm an oder aus, ich meine
  73. damit nicht dem Schalter den du vor dir hast und der Vielleicht rot
  74. leuchtet wie bei mir, sondern halt der Softwaremaessige an und ausschalter
  75. den es im Amiga gibt, genauso verhaelt es sich mit Sprites, entweder ja
  76. oder nein. Das waeren Beispiele fuer das Setzen oder das loeschen von Bits,
  77. aber was ist mit der Abfrage, was sollte das fuer einen Sinn haben, und was
  78. koennte das schon fuer einen Sinn, ob Sprites da sind sehe ich ja, oder ob
  79. der Bildschirm an ist merke ich ja auch. Was koennte man also Abfragen.
  80.  
  81. Nun, ich schwoere das du die beiden im Moment wichtigsten schalter schon
  82. benutzt hast, naemlich die Maustasten. Gut, ne ?
  83. Es soll uns aber jetzt nur eine Interresieren, und zwar die Linke.
  84.  
  85. Dazu eine Kurze erklaerung....
  86. Der ganze Computer hat mit der Maus direkt relativ wenig zu tun, sondern
  87. nur ein Ganz bestimmter Chip, und zwar einer vom typ CIA, keine Bange es
  88. ist kein Bewaffneter Ami, sondern nur ein Normaler Chip. Er heisst
  89. richtig Computer Interface Adapter, was soviel bedeutet wie `interne
  90. Schnittstelle zwischen Hard und Software`. Und ihr koennt ihn direkt ohne
  91. Aufschrauben des Amigas beruehren, naemliche wenn ihr den Mausstecker zieht
  92. und die Pins Beruehrt, den die gehen direkt in diesen Chip rein, der wertet
  93. sie dann aus, und legt das ergebnis dann an seinen I/O port. Dort kann der
  94. user das dann Abfragen, oder dem CIA anweisungen geben.
  95. Also der Port des CIA`s der uns Interresiert liegt bei $BFE001, das solltet
  96. ihr euch merken, man nennt es CIAapra.
  97. Also wenn ihr Irgendwo dieses Wort lest dann wisst ihr welches es ist.
  98.  
  99. Naja, wo waren wir doch gleich, achja bei der Linken Maustaste.
  100. Tja, die kann man halt bei Bit 6 im CIAapra abfragen.
  101. Wie das erklaere ich jetzt, aber erstmal alle Befehle zur direkten
  102. Bitmanipulation
  103.  
  104. Bset
  105. Bclr
  106. Bchg
  107.  
  108. und die Bitabfrage..
  109.  
  110. Btst
  111.  
  112. So, also Bset ist Bitsetzen
  113.  
  114. Bset #6,$40000 , wuerde Bit 6 in der adresse $40000 setzen
  115.  
  116. Bclr loescht das Bit.
  117.  
  118. Ein schoener Befehl ist auch noch der Bchg befehl, den er wechselt den
  119. Momentanen zustand des Bits das man nennt,war es gesetzt wird es geloescht.
  120.  
  121. Ein Kleines Beispiel waere stark verwandt mit unserem Ziel mit der Maus,
  122. denn Bit 1 des CIAapra registers ist die Power Led des Amiga. Abfragen hat
  123. nicht viel Sinn, aber an und ausmachen koennen wir sie, wobei noch ein
  124. Problem ist, und zwar das alle CIA-schalter die man setzen oder loeschen
  125. kann, Lowaktiv sind, das heisst, wenn sie an sind, sind sie aus. Also wenn
  126. die lampe des Amigas an ist, wie jetzt zum Beispiel bei mir, dann ist Bit 1
  127. vom CIAapra geloescht, ist die lampe aus, zb. beim Guru-Blinken wird sie
  128. gesetzt.
  129.  
  130. Wenn ihr also folgendes kurzprogramm eingebt, und es startet, mueste die
  131. Lampe ausgehen.
  132.  
  133. Bset #1,$BFE001
  134. rts
  135.  
  136. Wie ihr wisst, setzen des Bits ist eigentlich loeschen, somit geht die
  137. lampe aus. Um sie wieder anzukriegen muesst ihr einfach das Bset in ein
  138. Bclr umwandeln, starten, und schon geht sie an.
  139. Das kann man aber schneller haben, indem man einfach den bchg-befehl
  140. benutzt, denn der aendert halt immer nur das Bit, an aus an aus.
  141.  
  142. Schoene Spielerei, werden wir aber erst gleich weiter spielen, nachdem wir
  143. die Maus und warteschleifen beherschen.
  144.  
  145. O.K weiter mit der Maus....
  146. Wir Fragen ein Bit mit den Btst-befehl ab. Und was macht der ?
  147. Nun er kopiert das Bit einfach in des Z-flag des Prozessors...
  148.  
  149. Ach, die Flags kennt ihr noch nicht..Nun in den Flags merkt sich der Prozessor
  150. die eigenschaften der letzen operation, wie zum Beispiel, ob es null war,
  151. oder ob das ergebnis im Negativen bereich war. Und das Z-Flag sagt eben aus
  152. ob die operation Null war oder nicht.
  153. Beim Btst befehl uebernimmt der Befehl das setzen des Bits wir muessen es
  154. nur noch abfragen, naja das hoert sich jetzt leicht an aber es kommt nun
  155. ein ganze menge auf euch zu, naemlich
  156.  
  157. 4.Bedingtes abzweigen mittels Branchen.
  158.  
  159. So, wo fangen wir den jetzt an....najut erstmal die Abfrage abhandeln.
  160. Die beiden befehle zum abfrage ob null oder nicht heisse
  161.  
  162. Bne und Beq
  163.  
  164. Bne (Branch if Not Equal) verzweigt wenn nicht null, und Beq (Branch if
  165. Equal) verzweigt wenn null. Das ist klar, was dann passiert kommt spaeter.
  166.  
  167. Um euch das Branchen zu erklaeren muss ich nochmal zum normalen
  168. Sprungbefehl zurueck kommen.
  169. Wie war das noch, er verbiegt den PC auf eine Neue Adresse, und macht dann
  170. da weiter. Beim branchen geschieht das auch, aber erst spaeter, denn er
  171. muss den neuen wert erstmal ausrechnen, und das macht er anhand des wertes
  172. der hinter den Branch befehl steht, der sagt naehmlich die Distanz zum
  173. neuen ziel aus, diese distanz wird dann dazu oder abgerechnet, und dann
  174. gehts weiter, hier mal ein prograemmchen welches das ungefaehr macht was
  175. dann passiert.
  176.  
  177. Move.l Distanz,d0       ;Distanz nach d0
  178. Move.l A7,d1            ;Adresse im PC nach d1
  179. Add.l (Sub.l) d0,d1     ;Distanz wert Addieren oder Subtrahieren
  180. Move.l d1,a7            ;Neuen PC schreiben (diesmal ist der zugriff
  181.                         ;erlaubt.
  182.  
  183. Tippt dieses programm nicht ab, denn es ruf einen absturz hervor.
  184.  
  185. Um das ausrechnen des distanzwertes brauchen wir uns nicht zu kuemmern,
  186. denn das uebernimmt der Seka fuer uns (hoffentlich).
  187. Wenn wir etwas mit einer solche bedingten verzweigung programmierung,
  188. bedienen wir uns einer Guenstigen einrichtung, die manche schon vom
  189. Amiga-basic her kennen, die Labels.
  190. Das sind Stellen im SourceCode die durch freiwaehlbaere namen genannt
  191. werden. Das sieht ungefaehr so aus....ich zeige es mal an einer Maustasten
  192. abrfrage...
  193.  
  194.  
  195. Wait:                           ;Label `wait`
  196.         Btst #6,$BFE001         ;Testet mausbit
  197.         bne.s wait              ;Falls nicht null, war nicht gedrueckt,
  198.                                 ;also wieder nach wait, um weiter zu
  199.                                 ;warten.
  200.  
  201. Die Distanz die der Assembler berechnet, bildet sich aus der Anzahl der
  202. byte die Zwischen dem Ende des bne-befehls und dem Anfang des Labels liegt.
  203. Bei diesem Beispiel waere es...rechnen wir das mal aus.
  204.  
  205. 1 word fuer die Distanz
  206. 1 word fuer den Bne befehl
  207. 1 langword fuer die $BFE001
  208. 1 word fuer die sechs
  209. 1 word fuer den Btst-befehl
  210.  
  211. gleich 12, da wir zurueck springen ist der wert -12. Klar ?
  212.  
  213. Wenn ein Branch befehl eingesetzt wird verzweigt er nur dann wenn seine
  214. bedingung erfuellt ist, das heisst - der Bne befehl verzweigt nur wenn
  215. nicht null, in unserem Beispiel also nur wenn die maustaste nicht gedrueckt
  216. ist. Andernfalls macht er nach dem befehl weiter. um also eine lauffaehige
  217. Maustasten abfrage zu programmieren, muessten wir nur noch ein RTS
  218. dahitnersetzen. Das Ganze saehe dann so aus.
  219.  
  220. Wait:   Btst #6,$BFE001
  221.         Bne wait
  222.         rts
  223.  
  224. Gebt das mal ein, und assembliert und startet das.
  225. Scheisse nichts passiert, schon wieder nichts. Doch er wartet auf die
  226. maustaste. Wird sie Gedrueckt, kommt er wieder. Toll, ne ?
  227.  
  228. So, damit sind wir bei ersten Programmwas sich lohnt abzuspeichern...
  229. Wir gehen raus aus dem Editor und Tippen `W`
  230. Nun fragt der Seka nach dem Filenamen, geben wir da mal WaitMaus ein.
  231. Krrrkk, Krrrk...faedich, der Seka hat das jetzt abgespeichert, und an den
  232. namen ein .S drangehaengt damit du auch Spaeter erkennst was SourceCode ist
  233. und was nicht.
  234. Denn wir koennen jetzt mal einen Cli-befehl aus dem ding machen, wie ? ganz
  235. einfach.
  236. Zur sicherheit Nochmal assemblieren, aber nicht starten.
  237. Da wir uns im Kommando modus befinden, tippen wir `WO` fuer Write Object.
  238. Nach dem Filenamen fragt der Seka natuerlich auch, und dann generiert er
  239. ein laufaehiges programm auf der Diskette. ihr koennt es Natuerlich wieder
  240. WaitMaus nennen den der SourceCode hat ein .S dran, beim ObjectCode macht
  241. der Seka das nicht.
  242. So um auszuprobieren was ihr jetzt schon gemacht habt, verlasst ihr jetzt
  243. mal den Seka mit `!` und `Y`, und tippt im Cli den namen des eben
  244. generierten Programms ein. Es passiert garnichts, nur das der Prompt nicht
  245. wieder zurueck kommt, denn das Programm ist so kurz das noch nicht mal die
  246. Drive-Led angeht. Drueckt ihr jetzt die Maus geht es weiter. Kopiert ihr
  247. das jetzt noch in den C-ordner habt ihr einen Sinnvollen Cli Befehl
  248. programmiert.
  249.  
  250. Ciao, bis denne
  251.  
  252.                 Jeff kandle
  253.